
package com.zoo.transfer

import org.bson.types.ObjectId;

import com.mongodb.BasicDBList;
import com.mongodb.BasicDBObject;
import com.mongodb.DBObject;

public abstract class JsonPretty {

    public static String toJsonPretty(DBObject jsonObject) {

        StringBuffer jsonText = new StringBuffer();
        jsonObjectToTextFormatted(jsonObject, 0, jsonText);

        return jsonText.toString();
    }

    static String spaces = "                    ";

    public static void jsonObjectToTextFormatted(BasicDBObject jsonObject, int indent, StringBuffer jsonText) {

        jsonText.append("{ ");
        appendNewLine(indent+2, jsonText);
        Set<String> keys = new TreeSet<String>(jsonObject.keySet());
        boolean isFirst = true;
        for(String key : keys) {
            if (isFirst) {
                isFirst = false;
            }
            else {
                jsonText.append(", ");
                appendNewLine(indent + 2, jsonText);
            }
            jsonText.append("\"").append(key).append("\": ");
            jsonObjectToTextFormatted(jsonObject.get(key), indent+2, jsonText);
        }
        appendNewLine(indent, jsonText);
        jsonText.append("}");
    }

    public static void jsonObjectToTextFormatted(BasicDBList jsonList, int indent, StringBuffer jsonText) {

        jsonText.append("[ ");
        appendNewLine(indent + 2, jsonText);
        boolean isFirst = true;
        for(Object element : jsonList) {
            if(isFirst) {
                isFirst = false;
            }
            else {
                jsonText.append(", ");
                appendNewLine(indent + 2, jsonText);
            }
            jsonObjectToTextFormatted(element, indent + 2, jsonText);
        }
        appendNewLine(indent, jsonText);
        jsonText.append("]");
    }

    public static void jsonObjectToTextFormatted(ArrayList jsonList, int indent, StringBuffer jsonText) {

        jsonText.append("[ ");
        appendNewLine(indent + 2, jsonText);
        boolean isFirst = true;
        for(Object element : jsonList) {
            if(isFirst) {
                isFirst = false;
            }
            else {
                jsonText.append(", ");
                appendNewLine(indent + 2, jsonText);
            }
            jsonObjectToTextFormatted(element, indent + 2, jsonText);
        }
        appendNewLine(indent, jsonText);
        jsonText.append("]");
    }

    private static void appendNewLine(int indent, StringBuffer jsonText) {
        jsonText.append("\n");
        jsonText.append(spaces.substring(0, indent));
    }

    public static void jsonObjectToTextFormatted(Object jsonObject, int indent, StringBuffer jsonText) {

        println "jsonObject=${jsonObject.class}"
        if(jsonObject instanceof BasicDBObject) {
            jsonObjectToTextFormatted((BasicDBObject) jsonObject, indent, jsonText);
        }
        else if(jsonObject instanceof ArrayList) {
            jsonObjectToTextFormatted((ArrayList) jsonObject, indent, jsonText);
        }
        else if(jsonObject instanceof BasicDBList) {
            jsonObjectToTextFormatted((BasicDBList) jsonObject, indent, jsonText);
        }
        else if(jsonObject instanceof String) {
            jsonText.append("\"").append(jsonObject).append("\"");
        }
        else if(jsonObject instanceof ObjectId) {
//            jsonText.append("{ \"$oid\" : \"" + jsonObject.toString() + "\" }");
            jsonText.append("{ \"\$oid\" : " + jsonObject.toString() + "\" }");
        }
//         else {
//            throw new ActivitiException("couldn't pretty print "+jsonObject.getClass().getName());
//        }
    }
}
